import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
 * Write a description of class REX here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Rex extends Actor
{
    final int jSpeed = 20; // el primer "salto" de velocidad
    int ySpeed = 0, xSpeed = 0; // las velocidades iniciales verticales y horizontales
    boolean aboutFace; // la dirección (izquierda o derecha) el actor se enfrenta
    boolean onGround; // el estado del actor se establece en un objeto o no
    private int cont,disparo=1;
    static int bandera;
    public int c=0,dir=1,count;
    public int niv=1,vidas=100,ammo=30,gun=1;
    private static GreenfootImage[] images;
     //GreenfootImage rex = new GreenfootImage("Personaje(rex)2");
    
    
    public Rex()
    {
      
        initializeImages();
        setImage(images[0]);
       
    }
    public synchronized static void initializeImages() 
    {
        if(images == null) {
            images = new GreenfootImage[16];
            for (int i = 0; i < 16; i++)
            {
                images[i] = new GreenfootImage("Rex" + (i+1) + ".png");
            }
        }
    }
     /** 
     * Comprueba si hay cambios en la dirección y se mueve el actor principal.
     */
    public void act()
    {
            if(vidas>1&&niv<5){
            MyWorld w = (MyWorld)getWorld();
            colicionesBalas();
            coliciones();
            if(gun==2)
            setImage(images[c+4]);
            if(gun==3)
            setImage(images[c+8]);
            if(gun==4)
            setImage(images[c+12]);
            if(gun==1)
            setImage(images[c]);
            getDirection();
            move();
            w.setjugx(getX());
        }
        else{
            if(vidas<1)
            getWorld().addObject(new gameover(),getWorld().getWidth()/2,getWorld().getWidth()/2-100);
            }
         
        
    
    }
    /**
     * Mueve el actor con la imagen correspondiente. Comprueba si hay obstáculos y ajusta
     * La posición del actor en consecuencia.
     */
    private void move()
    {
        ySpeed++; // suma gravedad
        //getWorld().addObject(new Rex2(),getX(),getY());
        
        setLocation(getX()+xSpeed/10, getY()+ySpeed);
        // comprobar el cambio en la dirección horizontal
       
        // compruebe si hay obstáculos
        onGround=false; // inicializar el valor no salta mas de dos veces 
        //marque a continuación el actor
        Actor amr1 = getOneIntersectingObject(Arma1.class);
        Actor amr2 = getOneIntersectingObject(Arma2.class);
        Actor amr3 = getOneIntersectingObject(Arma3.class);
        Actor amr4 = getOneIntersectingObject(Arma4.class);
        if(amr1==null&&amr2==null&&amr3==null&&amr4==null)
        {
       while(getOneObjectAtOffset(0, getImage().getHeight()/2+1, null)!=null)
        {
            setLocation(getX(), getY()-1); 
            onGround=true; 
            ySpeed=0;
        }
        Actor bull = getOneIntersectingObject(bullete1.class);
        Actor bull2 = getOneIntersectingObject(bulletGE.class);
        Actor door = getOneIntersectingObject(Puerta.class);
            if(bull==null&&bull2==null&&door==null){
            while(getOneObjectAtOffset(0, -getImage().getHeight()/2-1, null)!=null) 
            {
                setLocation(getX(), getY()+1);
                onGround=true;
                ySpeed = 0;
            }
           // verifique derecho del actor
            
           while(getOneObjectAtOffset(getImage().getWidth()/2+1, 0, null)!=null)
            {   
                setLocation(getX()-1, getY());
                onGround=true;
                xSpeed = 0;
            }
            //verificación a la izquierda del actorr
            while(getOneObjectAtOffset(-getImage().getWidth()/2-1, 0, null)!=null)
            {   
                setLocation(getX()+1, getY());
                onGround=true;
                xSpeed = 0;
            }
        }
    }
}
    /**
     * Determina los cambios en las velocidades horizontales y verticales para el actor.
     *  conjuntos solicitada dirección de movimiento, o continúa en dirección de la corriente
     */
    private void getDirection()
    {   int cont=2;
        
        /*
         if (Greenfoot.isKeyDown("left") && xSpeed>-50) xSpeed-=2; // check left
        if (Greenfoot.isKeyDown("right") && xSpeed<50) xSpeed+=2; 
        */
        if (Greenfoot.isKeyDown("left")&& xSpeed>-50 )
        {  //comprobar la izquierda
            if(c==0||c==1||c==3)
                c=2;
            else
               c=3;
            dir=2;
            xSpeed=-1;
            getOneObjectAtOffset(getImage().getWidth()/2+1, 0, null);
            setLocation(getX()-10, getY());
           
            //setImagen(GreenfootImage(rex));
            
        }
        if (Greenfoot.isKeyDown("right")&&xSpeed<50 )
        {   // comprobar derechoa
            if(c==0||c==2||c==3)
                c=1;
            else
                c=0;
            
            
            dir=1;
            xSpeed=1;
            getOneObjectAtOffset(-getImage().getWidth()/2-1, 0, null);
            setLocation(getX()+10, getY());
            
            /*super.setImage( jet[cont] );
             // mueve( 6 );        
              if(cont == 2 ){cont = 0;}
              else{cont ++;}*/
        }
        if (Greenfoot.isKeyDown("up") && onGround ) // comprobar brinco
        {
            if(ySpeed<200)
            {
            ySpeed=0;
            ySpeed -= jSpeed;//añadir saltar velocidad
            }
        
            
        }
      
        if(Greenfoot.isKeyDown("space"))
        {   
            //public static void delay(5);
           // Thread.currentThread().sleep(3000);
           if(ammo!=0){
           if(disparo ==1){
               if(gun==2||gun==3){
                  ammo-=3;
                  ((Ammo) getWorld().getObjects(Ammo.class).get(0)).add(-3);} // incrementar saltar contador
               else{
                  ammo--;
                  ((Ammo) getWorld().getObjects(Ammo.class).get(0)).add(-1);
                } // incrementar saltar contador
               disparo=0;
               disparar();
        }}
        else
            gun=1;
       }   
        if (!Greenfoot.isKeyDown("space"))
        {
            disparo = 1;
        }
        if(Greenfoot.isKeyDown("r"))
        {
            ((Ammo) getWorld().getObjects(Ammo.class).get(0)).carga(30);
            ammo=30;
        }
    }  
    public void coliciones(){
        
        Actor amr1 = getOneIntersectingObject(Arma1.class);
        Actor amr2 = getOneIntersectingObject(Arma2.class);
        Actor amr3 = getOneIntersectingObject(Arma3.class);
        Actor amr4 = getOneIntersectingObject(Arma4.class);
        Actor door = getOneIntersectingObject(Puerta.class);
        Actor up = getOneIntersectingObject(oneup.class);
        if (amr1!=null)
        {
           getWorld().removeObject(amr1);
           ((Ammo) getWorld().getObjects(Ammo.class).get(0)).carga(60);
            ammo=60;
            gun=1;
        }
        if (amr2!=null)
        {
           getWorld().removeObject(amr2);
           ((Ammo) getWorld().getObjects(Ammo.class).get(0)).carga(60);
            ammo=60;
            gun=2;
        }
        if (amr3!=null)
        {
           getWorld().removeObject(amr3);
           ((Ammo) getWorld().getObjects(Ammo.class).get(0)).carga(30);
            ammo=30;
            gun=3;
        }
        if (amr4!=null)
        {
           getWorld().removeObject(amr4);
           ((Ammo) getWorld().getObjects(Ammo.class).get(0)).carga(15);
            ammo=15;
            gun=4;
        }
        if (up!=null)
        {
           getWorld().removeObject(up);
            ((Lifes) getWorld().getObjects(Lifes.class).get(0)).add(25);
            
            vidas+=25;
            ((Vida) getWorld().getObjects(Vida.class).get(0)).getvid(vidas);
        }
        if(door!=null)
        {
            getWorld().removeObject(door);
            MyWorld w = (MyWorld)getWorld();
            
            w.setNivel(w.getNivel()+1);
            w.EliminarTodo();
            niv=w.getNivel();
            if(w.getNivel()<5){
            
            getWorld().addObject(new Level_up(),getWorld().getWidth()/2,getWorld().getWidth()/2-100);
            setLocation(-4500, 515);
            Greenfoot.delay(500000);
            getWorld().removeObjects(getWorld().getObjects(Level_up.class));  
            w.cargaNivel();
        }
        else
        {getWorld().addObject(new Fin(),getWorld().getWidth()/2,getWorld().getWidth()/2-100);}
            
        }
    
    }
    public void disparar()
    {
        switch(gun){
            case 1:
                    getWorld().addObject(new bullet1(dir),getX(),getY());
                    
            break;
            case 2: 
                if(dir==1){
                getWorld().addObject(new bullet1(dir),getX(),getY());
                getWorld().addObject(new bullet1(dir),getX()+50,getY());
                getWorld().addObject(new bullet1(dir),getX()+75,getY());
            }
            else{
                getWorld().addObject(new bullet1(dir),getX(),getY());
                getWorld().addObject(new bullet1(dir),getX()-50,getY());
                getWorld().addObject(new bullet1(dir),getX()-75,getY());
            }
            break;
            case 3:
                getWorld().addObject(new bullet1(dir),getX(),getY()-10);
                getWorld().addObject(new bullet1(dir),getX(),getY());
                getWorld().addObject(new bullet1(dir),getX(),getY()+10);
            break;
            case 4:
                 getWorld().addObject(new bulletG(dir),getX(),getY());
            break;
        }
    }
    public void colicionesBalas(){
        MyWorld w = (MyWorld)getWorld();
        Actor bal = getOneIntersectingObject(bullete1.class);
        Actor bal2 = getOneIntersectingObject(bulletGE.class);
        if (bal!=null)
        {
            getWorld().removeObject(bal);
            ((Lifes) getWorld().getObjects(Lifes.class).get(0)).add(-2);
            
            vidas-=2;
            ((Vida) getWorld().getObjects(Vida.class).get(0)).getvid(vidas);
        }
        if (bal2!=null)
        {
            getWorld().removeObject(bal2);
            ((Lifes) getWorld().getObjects(Lifes.class).get(0)).add(-30);
            getWorld().addObject( new explosion(), getX(), getY() );
            vidas-=30;
            ((Vida) getWorld().getObjects(Vida.class).get(0)).getvid(vidas);
        }
    }
}